package comun;

import java.util.ArrayList;
import java.util.List;

public class Sistema 
{
	private static Sistema S = null ;

	private List<Usuario> usuarios;
	private List<OficinaCorreo> oficinasCorreo;
	private List<RelacionConfianza> relacionesConfianza;
	private List<Mensaje> mensajes;
	
	public Sistema()
	{
		this.usuarios = new ArrayList<Usuario> () ;
		this.oficinasCorreo = new ArrayList<OficinaCorreo> () ;
		this.relacionesConfianza = new ArrayList<RelacionConfianza> () ;
		this.mensajes = new ArrayList<Mensaje> () ;
	}
	
	public static Sistema getInstancia()
	{
        if(S == null)
        {
            S = new Sistema();
        }
        return S;
    }
	
	public List<Usuario> getListaUsuarios (){
		return this.usuarios ;
	}
	
	public List<OficinaCorreo> getListaOficinas () {
		return this.oficinasCorreo ;
	}
	
	public List<RelacionConfianza> getRelacionesConfianza (){
		return this.relacionesConfianza ;
	}
	
	// tengo que valida que la oficina de correo donde esta registrada la casilla, tenga "confianza"
	// pero como una casilla puede estar registrada en varias oficinas, tengo que revisar todas las oficinas
	// donde esta registrada esa casilla
	public boolean validaRelacionConfianza (List<OficinaCorreo> listOrigen , List<OficinaCorreo> listDestino , List<RelacionConfianza> listRelaciones)
	{
		boolean confianza = false ;
		
		for (OficinaCorreo ofiOrig : listOrigen) 
		{
			for (OficinaCorreo ofiDest : listDestino) 
			{
				for (RelacionConfianza relAux : listRelaciones) 
				{
					if (relAux.getOficinaOrigen().getNombreOficina().equals(ofiOrig.getNombreOficina()) && relAux.getOficinaDestino().getNombreOficina().equals(ofiDest.getNombreOficina()))
					{
						confianza = true ;
					}	
				}
			}
		}
		
		return confianza ;
	}
	
	public void agregarUsuario (Usuario user)
	{
		this.usuarios.add(user) ;
	}
	
	public Usuario obtenerUsuario (String nombreUsuario)
	{
		for (Usuario auxUser : usuarios) 
		{
			if (auxUser.getNombre() == nombreUsuario)
				return auxUser ;
		}
		return null;
	}
	
	public OficinaCorreo obtenerOficina (String nombreOficina)
	{
		for (OficinaCorreo auxOficina : oficinasCorreo)
		{
			if (auxOficina.getNombreOficina() == nombreOficina)
				return auxOficina ;
		}
		return null ;
	}
	
	public void agregarOficinaCorreo (OficinaCorreo oficina)
	{
		this.oficinasCorreo.add(oficina) ;
	}
	
	public void agregarRelacionConfianza (RelacionConfianza relacion)
	{
		this.relacionesConfianza.add(relacion) ;
	}
	
	public void agregarMensaje (Mensaje mensaje)
	{
		this.mensajes.add(mensaje) ;
	}
	
	public String listarUsuariosRegistrados ()
	{
		String X = "LISTA DE USUARIOS REGISTRADOS:" ;
		for (Usuario auxUser : usuarios) 
		{
			X = X + "\n" + auxUser.toString() ;
		}
		return X ;
	}
	
	public List<OficinaCorreo> obtenerVectorOficinas ()
	{
		return this.oficinasCorreo ;
	}
	
	public List<Usuario> obtenerVectorUsuarios ()
	{
		return this.usuarios ;
	}
	
	public List<RelacionConfianza> obtenerVectorRelacionesConfianza ()
	{
		return this.relacionesConfianza ;
	}
	
	public List<CasillaCorreo> obtenerVectorCasillasCorreo ()
	{
		List<CasillaCorreo> casillas = new ArrayList<CasillaCorreo> () ;
		for (OficinaCorreo auxOficina : oficinasCorreo)
		{
			casillas.addAll(auxOficina.obtenerVectorCasillas()) ;
		}
		return casillas ;
	}
	
	public String listarOficinasRegistradas ()
	{
		String X = "" ;
		for (OficinaCorreo auxOficina : oficinasCorreo) 
		{
			X = X + "\n" + auxOficina.toString() ;
		}
		return X ;
	}
}
